﻿#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>      
//#include <stdlib.h>
//
//struct Stu //学⽣
//{
//	char name[20];//名字
//	int age;//年龄
//};
////假设按照年龄来⽐较
//int cmp_stu_by_age(const void* e1, const void* e2)
//{
//	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
//}
////strcmp - 是库函数，是专⻔⽤来⽐较两个字符串的⼤⼩的
////假设按照名字来⽐较
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
//	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}
//
////按照年龄来排序
//void test2()
//{
//	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
//	int sz = sizeof(s) / sizeof(s[0]);
//	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
//	printf("按照年龄排序:\n");
//	printf("%d %s\n", s[0].age, s[0].name);
//}
////按照名字来排序
//void test3()
//{
//	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
//	int sz = sizeof(s) / sizeof(s[0]);
//	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
//	printf("按照名字排序:\n");
//	printf("%d %s\n", s[0].age, s[0].name);
//}
//
//int main()
//{
//	test2();
//	test3();
//	return 0;
//}



//void bubble_sort(int arr[], int sz)
//{
//	int i = 0;
//	//趟数 — 次数最多的情况也不会多于数组元素个数
//	for(i = 0; i < sz-1; i++)
//	{
//		int flag = 0;//假设已经有序
//		//处理一趟排序的过程
//		for (int j = 0; j < sz-1-i; j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				flag = 1;
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;//完成交换
//			}
//		}
//		if (flag == 0)//说明没有任何元素发生交换，也就是排序完成
//		{
//			break;
//		}
//	}
//}
//
////设计一个函数来打印数组
//void print_arr(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//
//int main()
//{
//	//3,1,7,5,8,9,0,2,4,6
//	//排序 - 排成升序
//	int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//
//	print_arr(arr, sz);
//
//	bubble_sort(arr, sz);
//
//	print_arr(arr, sz);
//
//	return 0;
//}



//#include <stdio.h>
//
//void Swap(char* buf1, char* buf2,size_t size)
//{
//	int i = 0;
//	for (i = 0; i < size; i++)
//	{
//		char tmp = *buf1;
//		*buf1 = *buf2;
//		*buf2 = tmp;
//		buf1++;
//		buf2++;
//	}
//}
//
//void bubble_sort(void* base, size_t num, size_t size, int cmp(const void*, const void*))
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < num - 1; i++)
//	{
//		int flag = 0;
//		for (j = 0; j < num - 1 - i; j++)
//		{
//			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
//			{
//				Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
//			}
//		}
//	}
//}
////下面实验一下bubble_sort
//
////整型的比较
//int cmp_int(const void* buf1, const void* buf2)
//{
//	return *(int*)buf1 - *(int*)buf2;
//}
//
////写一个函数打印数组
//void print_arr(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
////结构体的排序：
//
//struct Stu
//{
//	char name[20];
//	int age;
//};
//
////假设按照年龄来⽐较
//int cmp_stu_by_age(const void* e1, const void* e2)
//{
//	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
//}
//
////假设按照名字来⽐较
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
//	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}
//
//
////按照年龄来排序
//void test1()
//{
//	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
//	int sz = sizeof(s) / sizeof(s[0]);
//	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
//	printf("按照年龄排序:\n");
//	printf("%d %s\n", s[0].age, s[0].name);
//}
////按照名字来排序
//void test2()
//{
//	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
//	int sz = sizeof(s) / sizeof(s[0]);
//	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
//	printf("按照名字排序:\n");
//	printf("%d %s\n", s[0].age, s[0].name);
//}
//
//int main()
//{
//	int arr[] = { 2,3,5,6,8,7,9,1,4 };
//	int num = sizeof(arr) / sizeof(arr[0]);
//	int size = sizeof(arr[0]);
//	bubble_sort(arr, num, size, cmp_int);
//	print_arr(arr, num);
//
//	test1();
//	test2();
//	return 0;
//}



//#include <stdio.h>
//#include <string.h>
//
//int main()
//{
//	char arr1[] = "abc";
//	char arr2[] = { 'a','b','c' };
//
//	printf("%zd\n", sizeof(arr1));//\0也会算进去
//	printf("%zd\n", sizeof(arr2));
//
//	printf("%zd\n", strlen(arr1));
//	printf("%zd\n", strlen(arr2));//越界了，会产生随机值
//	return 0;
//}
//
//int main()
//{
//	int a[] = { 1,2,3,4 };
//	printf("%d\n", sizeof(a));
//	printf("%d\n", sizeof(a + 0));
//	printf("%d\n", sizeof(*a));
//	printf("%d\n", sizeof(a + 1));
//	printf("%d\n", sizeof(a[1]));
//	printf("%d\n", sizeof(&a));
//	printf("%d\n", sizeof(*&a));
//	printf("%d\n", sizeof(&a + 1));
//	printf("%d\n", sizeof(&a[0]));
//	printf("%d\n", sizeof(&a[0] + 1));
//	return 0;
//}



//int main()
//{
//	char arr[] = { 'a','b','c','d','e','f' };
//
//	printf("%zd\n", sizeof(arr));//6-计算整个数组的大小
//	printf("%zd\n", sizeof(arr + 0));//arr + 0是首元素的地址，4/8个字节
//	printf("%zd\n", sizeof(*arr));//*arr是首元素，1个字节
//	printf("%zd\n", sizeof(arr[1]));//1
//	printf("%zd\n", sizeof(&arr));//&arr是数组的地址，是地址就是4/8个字节
//	printf("%zd\n", sizeof(&arr + 1));//&arr + 1是跳过数组后的那个地址，是地址就是4/8个字节
//	printf("%zd\n", sizeof(&arr[0] + 1));//&arr[0] + 1是第二个元素的地址，是地址就是4/8个字节
//
//	return 0;
//}



//int main()
//{
//	char arr[] = { 'a','b','c','d','e','f' };
//	printf("%zd\n", strlen(arr));//随机值
//	printf("%zd\n", strlen(arr + 0));//随机值
//	printf("%d\n", strlen(*arr));//*arr - 'a' - 97 ,strlen会将97当做地址使用，这个时候就是非法访问 -- err
//	//printf("%zd\n", strlen(arr[1]));//'b' - 98 --err
//	printf("%zd\n", strlen(&arr));//随机值 x
//	printf("%zd\n", strlen(&arr + 1));//随机值 y
//	printf("%zd\n", strlen(&arr[0] + 1));//&arr[0] + 1是第二个元素的地址，得到随机值
//
//	return 0;
//}



//int main()
//{
//	char arr[] = "abcdef";
//	//[a b c d e f \0]
//	printf("%zd\n", sizeof(arr));//7
//	printf("%zd\n", sizeof(arr + 0));//4/8
//	printf("%zd\n", sizeof(*arr));//1
//	printf("%zd\n", sizeof(arr[1]));//1
//	printf("%zd\n", sizeof(&arr));//4/8
//	printf("%zd\n", sizeof(&arr + 1));//4/8
//	printf("%zd\n", sizeof(&arr[0] + 1));//4/8
//
//	return 0;
//}


//
//int main()
//{
//	char arr[] = "abcdef";
//	printf("%zd\n", strlen(arr));//6
//	printf("%zd\n", strlen(arr + 0));//6
//	//printf("%zd\n", strlen(*arr));//'a'- 97 - 非法访问 //err
//	//printf("%zd\n", strlen(arr[1]));//'b'-98 - 非法访问 //err
//	printf("%zd\n", strlen(&arr));//6
//	printf("%zd\n", strlen(&arr + 1));//随机值
//	printf("%zd\n", strlen(&arr[0] + 1));//5
//
//	return 0;
//}



int main()
{
	char* p = "abcdef";

	printf("%zd\n", sizeof(p));//计算是p这个指针变量的大小 - 4/8
	printf("%zd\n", sizeof(p + 1));//p+1是第二字符b的地址，- 4/8
	printf("%zd\n", sizeof(*p));//*p是第一个字符，1
	printf("%zd\n", sizeof(p[0]));//1
	printf("%zd\n", sizeof(&p));//4/8
	printf("%zd\n", sizeof(&p + 1));//4/8
	printf("%zd\n", sizeof(&p[0] + 1));//&p[0] + 1是b的地址，4/8

	return 0;
}
